home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / common / Conversation.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  9KB  |  252 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. from logging import getLogger
  6. from actions import ActionMeta
  7. from Buddy import get_bname
  8. from Queue import Queue
  9. from common import pref, notifications, profile, netcall
  10. from util import Storage as S
  11. from datetime import datetime
  12. from util.observe import Observable, ObservableList, observable_dict
  13. from util import format_xhtml, traceguard
  14. log = getLogger('common.conversation')
  15. AUTORESP = _('[Auto-Response] ')
  16.  
  17. class Conversation(Observable):
  18.     __metaclass__ = ActionMeta
  19.     AUTORESP = AUTORESP
  20.     
  21.     def __init__(self):
  22.         Observable.__init__(self)
  23.         self.room_list = ObservableList()
  24.         self.protocol = None
  25.         self.messages = Queue()
  26.         self.autoresponded = False
  27.         self.typing_status = observable_dict()
  28.         self.just_had_error = False
  29.  
  30.     
  31.     def icon(self):
  32.         if self.ischat:
  33.             skin = skin
  34.             import gui
  35.             return skin.get('serviceicons.digsby')
  36.         else:
  37.             return self.buddy.icon
  38.  
  39.     icon = property(icon)
  40.     
  41.     def send_message(self, message, *args, **kwargs):
  42.         if not isinstance(message, unicode):
  43.             raise TypeError
  44.         
  45.         echonow = pref('messaging.echo_immediately', type = bool, default = True)
  46.         
  47.         def error(e = (None, None)):
  48.             log.info('Error sending message: %r', message)
  49.             log.info('Message error callback received %r: %r', type(e), e)
  50.             if self.just_had_error:
  51.                 return None
  52.             
  53.             emsg = getattr(e, 'error_message', '')
  54.             if emsg:
  55.                 self.system_message(emsg, content_type = 'text/plain')
  56.             else:
  57.                 self.system_message(_('Some of the messages you sent may not have been received.'), content_type = 'text/plain')
  58.             self.just_had_error = True
  59.  
  60.         
  61.         def message_sent():
  62.             self.just_had_error = False
  63.  
  64.         
  65.         def echo_message(msg = (None, (None,), None)):
  66.             if not msg:
  67.                 pass
  68.             echomsg = message
  69.             if kwargs.get('auto', False):
  70.                 if 'has_autotext' not in kwargs:
  71.                     kwargs.update(has_autotext = True)
  72.                 
  73.             
  74.             self.sent_message(echomsg, **kwargs)
  75.  
  76.         if echonow:
  77.             
  78.             def success(msg = (None,)):
  79.                 message_sent()
  80.  
  81.             echo_message()
  82.         else:
  83.             
  84.             def success(msg = (None, None)):
  85.                 message_sent()
  86.                 echo_message(msg)
  87.  
  88.         conn = profile.connection
  89.         if conn is not None:
  90.             conn.send_message_intercept(self.buddy, message)
  91.         
  92.         (None, None, None, None, None, netcall)((lambda : self._send_message(message, success = success, error = error, *args, **kwargs)))
  93.         if not self.ischat:
  94.             b = self.buddy
  95.             if b is not None and b is not self.protocol.self_buddy:
  96.                 profile.blist.add_tofrom('im', b, self.protocol)
  97.             
  98.         
  99.  
  100.     
  101.     def system_message(self, message, **opts):
  102.         log.debug('System message: message=%r, opts=%r', message, opts)
  103.         opts['buddy'] = None
  104.         opts['type'] = 'status'
  105.         self._message(message = message, **opts)
  106.  
  107.     
  108.     def buddy_says(self, buddy, message, **options):
  109.         if not isinstance(message, unicode):
  110.             raise TypeError, 'buddy_says needs unicode got type %r: %r' % (type(message), message)
  111.         
  112.         
  113.         try:
  114.             timestamp = options.get('timestamp', None)
  115.             if timestamp is None:
  116.                 timestamp = datetime.utcnow()
  117.             
  118.             Message = Message
  119.             import common.message
  120.             messageobj = Message(buddy = buddy, message = message, timestamp = timestamp)
  121.             plugin_hub = plugin_hub
  122.             import plugin_manager
  123.             type = options.get('type', None)
  124.             plugin_hub.act('digsby.im.msg.pre', messageobj, type)
  125.             if messageobj.message != '':
  126.                 self._message(buddy, messageobj.message, **options)
  127.                 plugin_hub.act('digsby.im.msg.async', messageobj, type)
  128.         except Exception:
  129.             e = None
  130.             log.error('Failed to parse message %r', e)
  131.             self._message(buddy, message, **options)
  132.  
  133.  
  134.     
  135.     def _message(self, buddy, message, **options):
  136.         if not options.get('offline', True):
  137.             options.pop('timestamp', None)
  138.         
  139.         if options.get('offline', False):
  140.             self.autoresponded = True
  141.         
  142.         timestamp = options.pop('timestamp', None)
  143.         if timestamp is None:
  144.             timestamp = datetime.utcnow()
  145.         
  146.         Message = Message
  147.         import common.message
  148.         messageobj = Message(buddy = buddy, message = message, timestamp = timestamp, conversation = self, **options)
  149.         profile = profile
  150.         import common
  151.         profile.on_message(messageobj)
  152.  
  153.     
  154.     def received_message(self, buddy, message, **options):
  155.         if not isinstance(message, unicode):
  156.             raise TypeError('message argument must be unicode')
  157.         
  158.         self.buddy_says(buddy, message, type = 'incoming', **options)
  159.  
  160.     
  161.     def sent_message(self, message, format = None, **options):
  162.         if not isinstance(message, unicode):
  163.             raise TypeError('message argument must be unicode')
  164.         
  165.         buddy = self.self_buddy
  166.         message = message.encode('xml')
  167.         if format:
  168.             traceguard.__enter__()
  169.             
  170.             try:
  171.                 message = format_xhtml(message, format)
  172.             finally:
  173.                 pass
  174.  
  175.         
  176.         self.autoresponded = True
  177.         self.buddy_says(buddy, message, type = 'outgoing', **options)
  178.  
  179.     
  180.     def incoming_message(self, autoresp = True):
  181.         status = profile.status.for_account(self.protocol)
  182.         StatusMessage = StatusMessage
  183.         import common
  184.         get_default_format = get_default_format
  185.         import gui.uberwidgets.formattedinput
  186.         if all((autoresp, status.away, not (status.invisible), status != StatusMessage.Offline, pref('messaging.when_away.autorespond', False), not (self.autoresponded))):
  187.             if status.message:
  188.                 self.autoresponded = True
  189.                 import wx as wx
  190.                 
  191.                 def later():
  192.                     self.autorespond(status.message, format = get_default_format())
  193.  
  194.                 later = (None, None, wx.CallAfter)(later)
  195.             
  196.         
  197.  
  198.     
  199.     def __contains__(self, buddy):
  200.         bname = get_bname(buddy)
  201.         buddy = self.buddies[bname]
  202.         return buddy in self.room_list
  203.  
  204.     
  205.     def tingle(self):
  206.         self.system_message('Your digsby sense is tingling!')
  207.  
  208.     
  209.     def buddy(self):
  210.         r = self.room_list[:]
  211.         while self.self_buddy in r:
  212.             r.remove(self.self_buddy)
  213.         if len(r) == 1:
  214.             return r[0]
  215.         elif self.room_list:
  216.             pass
  217.         
  218.         return self.self_buddy
  219.  
  220.     buddy = property(buddy)
  221.     
  222.     def send_typing_status(self, status):
  223.         raise NotImplementedError
  224.  
  225.     
  226.     def exit(self):
  227.         raise NotImplementedError
  228.  
  229.     
  230.     def autorespond(self, msg, format = None, **kws):
  231.         if not self.ischat:
  232.             if self.buddy.isbot:
  233.                 log.info('Not sending autoresponse to bot: %r', self.buddy)
  234.                 return None
  235.             
  236.             if 'has_autotext' not in kws:
  237.                 kws.update(has_autotext = True)
  238.             
  239.             self.send_message(AUTORESP + msg, auto = True, format = format, **kws)
  240.         
  241.  
  242.  
  243. if __name__ == '__main__':
  244.     convo = Conversation()
  245.     
  246.     def convo_changed(source, attr, old, new):
  247.         print attr, old, new
  248.  
  249.     convo.add_observer(convo_changed)
  250.     convo.last_message = 'test message'
  251.  
  252.